package com.agv.core.util;


import java.util.ArrayList;

import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.springframework.jdbc.core.JdbcTemplate;

import com.agv.core.exception.AgvException;
import com.agv.core.objectDomain.GenericRowData;



public class UtileriaBD {

	
	JdbcTemplate jdbcTemplate;


	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}


	public int setRegister(GenericRowData row) throws AgvException {
	
		try{
			List<String> nombresCampos = new ArrayList<String>();
			Map<String,Object> datosFila = row.getDatosFila();
			
			int valorSecuencia = jdbcTemplate.queryForInt( " SELECT NEXTVAL('"+ row.getNombreSecuencia() +"') " );
			
			//agregamos campo de la pk y su valor junto con los otros campos
			row.getDatosFila().put(row.getNombrePK(), valorSecuencia);
			  
			  
			//obtenemos todos los campos de la tabla q van a insertarse
			for (Iterator<String> iterator = datosFila.keySet().iterator(); iterator.hasNext();) {
				nombresCampos.add(iterator.next());
			}
			  
			//Creamos un string con los nombres de los campos de la tabla
			StringBuilder camposQry = new StringBuilder();
			for ( int i = 0 ; i < nombresCampos.size() ; i++ ) {
				if( i == ( nombresCampos.size() - 1 ) ){//en el ultimo paso no agregamos coma
					camposQry.append(nombresCampos.get(i));
				}else{
					camposQry.append(nombresCampos.get(i));
					camposQry.append(",");
				}
			}
		
			//string con los valores de cada una de las columnas
			StringBuilder strValCampos = new StringBuilder();
			Object[] paramsQry = new Object[nombresCampos.size()];	
			
			for ( int i = 0 ; i < nombresCampos.size() ; i++ ) {
				if( i == ( nombresCampos.size() - 1 ) ){//en el ultimo paso no agregamos coma
					strValCampos.append("?");
				}else{
					strValCampos.append("?");
					strValCampos.append(",");
				}
				paramsQry[i] = datosFila.get( nombresCampos.get(i) );
			}
				  
			String query = "INSERT INTO "+row.getNombreTabla() +"("+camposQry+") values ("+strValCampos+") ";
			  
			jdbcTemplate.update(query, paramsQry);
			  
			//debe de regresar el ultimo numero de secuencia insertado
			return valorSecuencia;
			
		}catch(Exception ex){
			throw new AgvException(ex);
		}
            
	}



	public void deleteRegister(GenericRowData row ) throws AgvException{
		
		try{
			
			String query = " DELETE FROM " + row.getNombreTabla() + " WHERE " + row.getNombrePK() + " = ? ";
			jdbcTemplate.update( query, new Object[]{ row.getValorPK() } );
			
		}catch(Exception e ){
			throw new AgvException(e);
		}
		
	}


	
	public int updateRegister(GenericRowData row) throws AgvException{
		
		try{
			
			//solo vienen los campos q se van a actualizar exceptlo la pk
			Map<String,Object> datosFila = row.getDatosFila();
			
			
			//obtener el nombre de los campos
			List<String> nombCampos = new ArrayList<String>(); 
			for(Iterator<String> iterator = datosFila.keySet().iterator(); iterator.hasNext(); ){
				nombCampos.add( iterator.next() );
			}
			
			//valores de los campos
			Object[] paramQry = new Object[nombCampos.size()];
			
			
			//construccion de cadena dinamica
			StringBuilder camposQry = new StringBuilder();
			for (int i = 0; i < nombCampos.size(); i++) {
				
				if( i == ( nombCampos.size()-1 ) ){//el ultimo elemento no lleva coma
					camposQry.append( nombCampos.get(i) );
					camposQry.append(" = ? ");
				}else{
					camposQry.append( nombCampos.get(i) );
					camposQry.append(" = ?, ");
				}
				paramQry[i] = datosFila.get( nombCampos.get(i) );
			}		
			
			
			String query = " UPDATE " + row.getNombreTabla() + " SET " + camposQry + " WHERE " + row.getNombrePK() + " = " + row.getValorPK() ;
			
			int insertados = jdbcTemplate.update( query, paramQry ); 
			
			return insertados;
			
		}catch (Exception e) {
			throw new AgvException(e);
		}
		
	}




}
